#ifndef _INPUT_READER_BOX_H_JM_20110828_
#define _INPUT_READER_BOX_H_JM_20110828_

#include "GenericBoxModel.h"
#include "../table/JoinContext.h"

namespace jm4bbx {

//template<class KeyType>
//class InputReaderBox  : public bobox::basic_box2  {
//public:
//    enum { START_GROUP = 0, OUTPUT_GROUP_1 = 1, OUTPUT_GROUP_2 = 2 };
//    enum { OUTPUT_G1_COLUMN_1 = 0, OUTPUT_G1_COLUMN_2 = 1, OUTPUT_G2_COLUMN_1 = 2, OUTPUT_G2_COLUMN_2 = 3 };
//
//    typedef GenericBoxModel<InputReaderBox, InputTablesContext<KeyType> > model;
//    	
//    InputReaderBox(bobox::box_id_type id, bobox::box_tid_type tid, bobox::request *req, 
//        const bobox::parameters &params, InputTablesContext<KeyType>* context) : 
//        bobox::basic_box2(id, tid, req), context_(context) {
//            
//            chunkCount1_ = chunkCount2_ = chunkIndex1_ = chunkIndex2_ = -1;
//            
//            if (params.has_parameter("n1")) {
//                params.get_parameter("n1", chunkCount1_);
//            }
//            if (params.has_parameter("n2")) {
//                params.get_parameter("n2", chunkCount2_);
//            }
//            if (params.has_parameter("i1")) {
//                params.get_parameter("i1", chunkIndex1_);
//            }
//            if (params.has_parameter("i2")) {
//                params.get_parameter("i2", chunkIndex2_);
//            }            
//            
//            assert(chunkIndex1_ > -1);
//            assert(chunkIndex2_ > -1);
//            assert(chunkCount1_ > chunkIndex1_);
//            assert(chunkCount2_ > chunkIndex2_);
//
//            chunkSize1_ = context_->table1_.size() / chunkCount1_;
//            chunkSize2_ = context_->table2_.size() / chunkCount2_;
//    }
//
//    virtual void init_impl() {
//        
//        add_group(group_index_type(START_GROUP), bobox::column_index_type(OUTPUT_G1_COLUMN_1), 0);
//
//        initOutputGroup(OUTPUT_GROUP_1, OUTPUT_G1_COLUMN_1, OUTPUT_G1_COLUMN_1);
//        initChunk(OUTPUT_GROUP_1, OUTPUT_G1_COLUMN_1, chunkSize1_, 
//            chunkIndex1_*chunkSize1_, chunkIndex1_*chunkSize1_ + chunkSize1_, 
//            context_->table1_);
//        initOutputGroup(OUTPUT_GROUP_2, OUTPUT_G2_COLUMN_1, OUTPUT_G2_COLUMN_1);
//        initChunk(OUTPUT_GROUP_2, OUTPUT_G2_COLUMN_1, chunkSize2_, 
//            chunkIndex2_*chunkSize2_, chunkIndex2_*chunkSize2_ + chunkSize2_, 
//            context_->table2_);
//
//        receive(bobox::inarc_index_type(0), group_index_type(0));
//    }
//
//    virtual void sync_mach_etwas() {
//        const group& g = get_group(group_index_type(START_GROUP));
//	    if (g.poisoned_) {
//            //send_poisoned(bobox::outarc_index_type(OUTPUT_G1_COLUMN_1));
//            //return;
//        }
//        
//         get_group(group_index_type(OUTPUT_GROUP_1)).wrpos_ = chunkSize1_;
//         get_group(group_index_type(OUTPUT_GROUP_2)).wrpos_ = chunkSize2_;
//
//        send(bobox::outarc_index_type(OUTPUT_G1_COLUMN_1), group_index_type(OUTPUT_GROUP_1));
//        send(bobox::outarc_index_type(OUTPUT_G2_COLUMN_1), group_index_type(OUTPUT_GROUP_2));
//                
//        
//        send_poisoned(bobox::outarc_index_type(OUTPUT_G1_COLUMN_1));
//        send_poisoned(bobox::outarc_index_type(OUTPUT_G2_COLUMN_1));
//        receive(bobox::inarc_index_type(0), group_index_type(0));
//        //send_poisoned(bobox::outarc_index_type(OUTPUT_G1_COLUMN_2));
//        //send_poisoned(bobox::outarc_index_type(OUTPUT_G2_COLUMN_2));
//    }
//
//protected:
//
//    inline void initOutputGroup(int group, int column, int output) {
//        add_group(
//			group_index_type(group),
//			bobox::column_index_type(column), 	
//            get_output_descriptors(bobox::outarc_index_type(output)));
//    }
//
//    inline void initChunk(int group, int column, size_t size, size_t begin, size_t end,
//        const MultiTypeTable<KeyType>& table) {
//
//            allocate(group_index_type(group), size);
//            for (size_t i = begin; i < end; ++i) {
//				    get_data<bobox::int_policy>(bobox::column_index_type(column))[i - begin] = 
//                        table.getKey(i);
//                    get_data<bobox::int_policy>(bobox::column_index_type(column + 1))[i - begin] = i;
//            }
//    
//    }
//
//    InputTablesContext<KeyType>* context_;
//    int chunkCount1_, chunkCount2_;
//    int chunkIndex1_, chunkIndex2_;
//    size_t chunkSize1_, chunkSize2_;
//
//};



} // namespace jm4bbx
#endif
